<?php
导读：陈捷，优才学院Web全栈第三期学员。本文是他在成功拿到中国最大的自营式电商企业的offer后给大家分享的面试题。在文中他总结了在参加一些互联网大公司面试过程中遇到的8大经典面试题，内容涉及PHP的复习机制、nginx高可用实现、常见排序算法、一致性hash、秒杀抢购等方面的知识，同时还针对相应的面试题给出了参考文章。优优分享之，希望对大家的复习更具有针对性。

正文↓

最近因为换工作有参加过一些大公司的面试，现在基本尘埃落，和大家分享下我觉得比较好的面试或笔试的技术点。以此共勉吧。

1 、PHP的写时复制机制（Copy-On-Write)

例如这种形式

$a = 1;

$b = $a;  //当把a赋值给b时，在内存中a,b其实是指向同一块内存

$b = 2;   //只有当b值发生变化，才会内存复制赋新值

写时复制优点：是通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存的值，而是简单的通过一个计数器来共用内存，只有在其中的一个引用指向变量的值发生变化时才申请新空间来保存值内容以减少对内存的占用。

从PHP底层基础数据结构来看

ref_count和is_ref是定义于zval结构体中
is_ref标识是不是用户使用 & 的强制引用；
ref_count是引用计数，用于标识此zval被多少个变量引用，即写时复制的自动引用，为0时会被销毁

2 、nginx等高可用实现

使用双机通过 Keepalived 工具来实现 Nginx 的高可用（High Avaiability），达到一台Nginx入口服务器宕机，另一台备机自动接管服务的效果。

参考链接：https://segmentfault.com/a/1190000002881132

3、 常见排序算法

一般冒泡，选择，插入，快速

代码参考：PHP实现四种基本排序算法

需要注意的是选择，快速都是不稳定排序（对于同样数值排序后顺序会发生变化的为不稳定排序），然后需要注意快速的时间复杂度为O(nlog2 n) 其他为O(n²)

4 、一致性hash

简介：http://blog.csdn.net/cywosp/article/details/23397179

代码实现：http://my.oschina.net/wangdk/blog/133040

这里我想说的在cache场景时使用一致性hash最大的好处在于当某机宕机或者增加机器时候key的迁移成本是最低，涉及的数据量是最少。大家可以通过普通hash和一致性hash下同等变动机器量来对比下原key命中率的方式来判断迁移成本。

5 、系统容错能力

主要集中在重试机制，高可用，超时配置，服务降级，动态健康检查剔除机制等，

具体可参考：http://www.infoq.com/cn/articles/qq-web-system-practise

6、限流防刷

这里只想说下比较前置的也就是在Nginx层来做这些策略，通常我们可以通过一些第三方模块来实现，这里只想说下OpenResty,OpenResty 是一个基于 Nginx与 Lua 的高性能 Web 平台，其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

官网：http://openresty.org/cn/

一些场景使用：http://jinnianshilongnian.iteye.com/blog/2280928

更多玩法：http://drops.wooyun.org/tips/6403

最佳实践：https://www.gitbook.com/book/moonbingbing/openresty-best-practices/details

7 、SSO(Cookie,Session的区别）

SSO就是我们说的单点登录，说得简单点就是在一个多系统共存的环境下，用户在一处登录后，就不用在其他系统中登录，也就是用户的一次登录能得到其他所有系统的信任。然后这边早期我们是将信任关系会完全放在客户端，会通过对种下Cookie的解密获取登录信息，然后相对安全的方式是将信任关系置于服务端，客户端通过携带的token,sessionId等方式向服务端请求验证合法性。

具体可参考：http://blog.jobbole.com/92339/

8 、秒杀抢购等

对于秒杀类主要还是一个流量的限制，是一个漏斗模型，从Nginx开始的结合日志分析的动态限流防刷策略到真正秒杀时的占位排队，到虚库存耗尽时后将所有超出流量直接前置给纯静态页面的策略，其实都是层层控流的过程，实际到mysql或者redis等持久化库存数据时候的量已经非常可控。

?>